package cn.itsource.aigou.service.impl;

import cn.itsource.AjaxResult;
import cn.itsource.aigou.domain.ProductType;
import cn.itsource.aigou.mapper.ProductTypeMapper;
import cn.itsource.aigou.service.IProductTypeService;
import cn.itsource.common.client.RedisClient;
import cn.itsource.common.client.StaticPageClient;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jdk.nashorn.internal.parser.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 商品目录 服务实现类
 * </p>
 *
 * @author jxj
 * @since 2019-07-30
 */
@Service
public class ProductTypeServiceImpl extends ServiceImpl<ProductTypeMapper, ProductType> implements IProductTypeService {

    @Autowired
    private RedisClient redisClient;

    @Autowired
    private StaticPageClient staticPageClient;

    /**
     * 生成主页面
     *
     * 先根据product.type.vm生成一个product.type.vm.html
     *
     * 再根据home.vm生成主页面
     *
     */
    @Override
    public void genHomePage() {

        //第一步 ： 生成product.type.vm.html
        Map<String,Object> map = new HashMap<>();

        String templatePath = "E:\\ideaProject\\aigou-parent\\aigou-product-parent\\aigou-product-service\\src\\main\\resources\\template\\product.type.vm";
        String targetPath = "E:\\ideaProject\\aigou-parent\\aigou-product-parent\\aigou-product-service\\src\\main\\resources\\template\\product.type.vm.html";
        //model 就是List 存放所有的商品类型
        List<ProductType> productTypes = loadTypeTree();
        map.put("model",productTypes);
        map.put("templatePath",templatePath);
        map.put("targetPath",targetPath);
        staticPageClient.genStaticPage(map);

        //第二步 ： 生成home.html
        map = new HashMap<>();
        //模板路径
        templatePath = "E:\\iderproject\\aigou-parent\\aigou-product-parent\\aigou-product-service\\src\\main\\resources\\template\\home.vm";
        //静态页面生成路径
        targetPath = "E:\\iderproject\\web-aigou-parent\\aigou-web-home\\home.html";
        //model 中要有一个数据是staticRoot
        Map<String,String> model = new HashMap<>();
        //找静态页面的位置  模板缺少斜杆要加上
        model.put("staticRoot","E:\\iderproject\\aigou-parent\\aigou-product-parent\\aigou-product-service\\src\\main\\resources\\");
        map.put("model",model);
        map.put("templatePath",templatePath);
        map.put("targetPath",targetPath);

        staticPageClient.genStaticPage(map);

    }
    @Override
    public List<ProductType> loadTypeTree() {
        //先查看缓存中是否有数据
        AjaxResult result = redisClient.get("productTypes");
        String restObj = (String)result.getRestObj();//将结果转成字符串形式
        //将字符串转成对应集合
        List<ProductType> productTypes = JSON.parseArray(restObj, ProductType.class);
        //如果集合中没有值表示缓存中没有，到数据库中查，并且缓存起来
        if(productTypes==null||productTypes.size()<=0){
            List<ProductType> loop = loop();
            redisClient.set("productTypes",JSON.toJSONString(loop));
        }

        //查询多级菜单
       return productTypes;
    }

    /**
     * 循环方式
     * @return
     */
    private List<ProductType> loop() {

        /**
         * 思路： 前提，数据库中存有菜单对应的父菜单
         *      想把所有的菜单选项查询出来，再获取它的父类菜单
         *      对应的domain中添加一个子类集合保存在类菜单
         *      先把一级菜单查出来 ，一级菜单没有父菜单 pid为
         */
        List<ProductType> productTypes = baseMapper.selectList(null);

        HashMap<Long, ProductType> productTypeHashMap = new HashMap<>();
        for (ProductType productType : productTypes) {
            Long pid = productType.getId();
            //把每个菜单的id保存到map中
            productTypeHashMap.put(pid, productType);
        }

        //把菜单封装成类似json的数据格式 先找到一级菜单 也就是父菜单 为0 的productType
        List<ProductType> list = new ArrayList<>();
        for (ProductType productType : productTypes) {
            Long pid = productType.getPid();
            if(pid==0){//表示一级菜单
                list.add(productType);
            }else {//表示有父菜单
                //找到对应的父菜单
                ProductType parent = productTypeHashMap.get(pid);
                List<ProductType> childrens = parent.getChildren();
                if(childrens==null){
                    childrens = new ArrayList<>();
                }
                parent.getChildren().add(productType);//将子菜单的封装到父菜单中
                parent.setChildren(childrens);
            }
        }
        return list;
    }
}
